<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body></body>
</html>
<script>
  // bigTnit es10 新增的一种数据类型

  // let obj = { name: "张三" };
  // let obj1 = obj;
  // obj1.name = "李四";
  // console.log(obj);
  // console.log(obj1);

  // JSON.parse(JSON.stringify()); 进行深拷贝
  // json 进行 深拷贝的弊端 不能直接深拷贝 包含函数的对象；

  // 递归函数
  // 自己调用自己我们就称为递归函数
  // 在使用递归函数的时候，一定要记得 return;
  //   function fn() {
  //     // 递归函数
  //     fn();
  //   }

  //   fn();

  //   for (let i = 0; i < 10; i++) {
  //     console.log(i);
  //   }

  //   let i = 0,
  //     sum = 0;
  //   function fn() {
  //     if (i < 100) {
  //       i++;
  //       sum += i;
  //       fn();
  //     } else {
  //       console.log(sum);
  //     }
  //   }
  //   fn();

  //   console.log(typeof []);
  // typeof 检测数据类型的时候 当数据是 null 也是 object

  //   let obj2 = { name: "王麻子" };
  //   console.log(obj2["name"]);
  function copy(obj) {
    let newObj = null; // 声明一个对象来存储拷贝之后的内容
    // 判断数据类型是否是复杂的数据类型，如果是则调用自己，如果不是则直接赋值即可！
    // 由于null不可以循环但是他的类型又是object，所以这个需要对null进行判断
    if (typeof obj == "object" && obj !== null) {
      // 声明一个变量用以存储拷贝出来的值，根据参数的具体数据类型声明不同的类型来存储
      newObj = obj instanceof Array ? [] : {};
      // 循环obj的每一项，如果里面还有复杂的数据类型的话，则直接利用递归函数再次调用。
      for (let i in obj) {
        newObj[i] = copy(obj[i]);
      }
    } else {
      newObj = obj;
    }
    return newObj; // 函数没有返回的值的话，则为undefined
  }

  let obj = {
    // 原对象，包含字符串，对象，函数，数组等不同类型。
    name: "test",
    main: {
      a: 1,
      b: 2,
    },
    fn: function () {},
    firends: [1, 2, 3, [44, 55]],
  };

  //   let obj1 = obj;
  //   obj1.main.a = 10;
  //   console.log(obj);

  let obj1 = copy(obj);
  obj1.main.a = 10;
  console.log(obj);
  console.log(obj1);

  //   let obj2 = {};
  //   obj2.name = "test";
  //   obj2.main = {};
  //   obj2.main.a = 1;
  //   obj2.main.b = 2;
  //   obj2.fn = function () {};
  //   obj2.firends[0] = 1
  //   obj2.firends[1] = 2
  //   obj2.firends[2] = 3
  //   obj2.firends[3][0] = 44
  //   obj2.firends[3][1] = 55
</script>
